from PIL import Image
import pdb
def deEncry(img, length):
    # 获取图片的宽和高
    width = img.size[0]
    height = img.size[1]

    # 计数器
    count = 0
    # 结果文本，从图片中提取到的附加值（加密时附加在每个灰度像素后的二进制数值）
    wt = ""

    # 遍历图片
    for i in range(width):
        for j in range(height):
            # 获取像素点的值
            gray_value = img.getpixel((i, j))

            # 提取像素的附加值
            wt = wt + str(gray_value % 2)
            # gray_value % 2计算当前像素值gray_value除以2的余数，在二进制表示中，这相当于获取最低位的值，即0或1.

            count += 1

            if count == length:
                break

        if count == length:
            break

    return wt

def showImage(wt, img_width, img_height):
    str1 = []
    for i in range(0, len(wt), 8):
        # 以每8位为一组二进制，转换为十进制
        str1.append(int(wt[i:i + 8], 2))

    # 图片大于水印图片1个像素，便于对比
    img_out = Image.new("L", (img_width + 1, img_height + 1))  # 使用灰度模式
    flag = 0
    for m in range(0, img_width):
        for n in range(0, img_height):
            if flag == len(str1):
                break
            img_out.putpixel((m, n), str1[flag])
            flag += 1
        if flag == len(str1):
            break

    img_out.save("解密图片.bmp")
    img_out.show()

# 水印图片的尺寸作为解密的密钥
w_image = Image.open('水印图片.bmp')
image_width = w_image.size[0]
image_height = w_image.size[1]
length = image_width * image_height * 8  # 注意这里改为 * 8，因为灰度图像每个像素只有一个附加值

# 获取图片
img1 = Image.open('加密图片.bmp')
gray_img1 = img1.convert('L')  # 使用灰度模式

wt = deEncry(gray_img1, length)
showImage(wt, image_width, image_height)
